package Bk.basic;

public class J12_SungJuk_v4b {

	public static void main(String[] args) {
		// 접근 지정자를 이용해서 SungJuk 클래스 정의
		J12SungJuk sj = new J12SungJuk();
		// sj.name = "길동";
		// name 멤버변수는 접근지정자가 private이므로
		// 위 코드처럼 작성하면 오류발생!
		sj = new J12SungJuk( "길동", 98, 65, 56);
		// 어쩔수 없이 생성자를 이용해서
		// name, kor, eng, mat 멤버변수를 초기화 함
		
		// System.out.println( sj.name );
		//하지만, 기존 방식으로 name 변수를 출력하려해도
		// private 접근 지정자 때문에 오류 발생!!
		
		// 따라서, private 으로 선언된 멤버변수를
		// 조작하거나 값을 읽어올려면
		// 그것을 위한 특별한 메서드를 작성하는 것이 좋음
		// 실무에서는 setter / getter 메서드를 작성함
//		sj.setName( "길동" ); 
//		System.out.println( sj.getName() );
//		sj.setKor( 98 ); 
//		System.out.println( sj.getKor() );
//		sj.setEng( 78 ); 
//		System.out.println( sj.getEng() );
//		sj.setMat( 54 ); 
//		System.out.println( sj.getMat() );
//		System.out.println( sj.getTotal() );
//		System.out.println( sj.getAverage() );
//		sj.getGrade();							
//		System.out.println( sj.getGrd() ); 
		
		// toString() 메서드를 이용해서
		// 객체의 모든 멤버변수 출력하기
		System.out.println( sj.toString() );
		
	} // main

} // class

class J12SungJuk {
	private String name;
	private int kor;
	private int eng;
	private int mat;
	private int tot;
	private double avg;
	private char grd;

	public J12SungJuk() { 	}
	public J12SungJuk( String name, int kor, int eng, int mat ) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	// setter 메서드 : 멤벼변수에 값을 set 하기 위한 메서드
	// public void set멤버변수명( 자료형 멤버변수명 ) {
	//		this.멤버변수명 = 멤벼변수명;
	// }
	public void setName( String name ) {
		this.name = name;
	}	
	public void setKor( int kor ) {
		this.kor = kor;
	}
	public void setEng ( int eng ) {
		this.eng = eng;
	}
	public void setMat ( int mat ) {
		this.mat = mat;
	}
//	public void setTotal ( int tot ) {
//		this.tot = tot;
//	}
//	public void setAverage ( int avg ) {
//		this.avg = avg;
//	}
//	public void setGrade ( int grd ) {
//		this.grd = grd;
//	}
	
	
	
	// getter 메서드 : 멤버변수의 값을 get 하기 위한 메서드
	// public 멤버변수자료형 get멤버변수명(  ) {
	//		return 멤버변수명;
	// }
	public String getName( ) {
		return name;
	}
	public int getKor( ) {
		return kor;
	}
	public int getEng( ) {
		return eng;
	}
	public int getMat( ) {
		return mat;
	}
	
	// 객체지향 프로그래밍에서는
	// 메서드에 너무 많은 책임을 부여하는 것을 금지하고 있음
	// 예를 들어, getTotal 메서드를 살펴보면
	// 단순히 tot 변수의 값을 읽어오는 기능외에
	// 입력한 성적데이터에 대한 총점을 구하는 기능도 포함
	
	public int getTotal () {
		tot = kor + eng + mat;
		// setTotal( kor + eng +mat );
		return tot;
	}
	public double getAverage () {
		// int imsi = getTotal();
		// avg = imsi / 3;
		avg = getTotal() / 3;
		return avg;
	}
	public char getGrade() {
		switch( ( int ) avg / 10 ){ 
		case 10: case 9: grd = '수'; break;
		case 8: grd = '우'; break;
		case 7: grd = '미'; break;
		case 6: grd = '양'; break;
		default : grd = '가' ; 
		}
		return grd;
	}
//	public char getGrd() {
//		return grd;
//	}		
	
	// 멤버변수의 모든 값을 출력하기 위해
	// Object 클래스가 기본으로 제공하는
	// 메서드인 toString( )을 재정의 override
	
	@Override	// 어노테이션: 컴파일러를 위한 주석
	public String toString() {
		String result = "";
			result = result + "이름 : " + name;
			result += " 국어 : " + kor;
			result += " 영어 : " + eng;
			result += " 수학 : " + mat;
			
			result += " 총점 : " + getTotal();
			result += " 평균 : " + getAverage();
			result += " 학점 : " + getGrade();
			
			return result;
	}
	
}


